//
// Created by ASUS on 2024/11/27/星期三.
//
#include <bits/stdc++.h>
using namespace std;

#define int long long

void solve(){
	int n;cin>>n;
	vector<int> a(n+1);
	for(int i=1;i<=n;i++)cin>>a[i];

	int m;cin>>m;
	vector<array<int,3>> queries(m);
	for(int i=0;i<m;i++){
		for(int j=0;j<3;j++){
			cin>>queries[i][j];
		}
	}

	int len=max(1LL,(int)sqrt(1.0*n*n/m));

	unordered_map<int,int> cnt,mp;

	auto get=[&](int x){
		return x/len;
	};

	auto add=[&](int x){
		int c=cnt[x];
		mp[c]--;
		mp[++cnt[x]]++;
	};

	auto del=[&](int x){
		int c=cnt[x];
		mp[c]--;
		mp[--cnt[x]]++;
	};

	vector<int> idx(m);
	iota(idx.begin(),idx.end(),0);
	sort(idx.begin(),idx.end(),[&](int i,int j){
		int a=get(queries[i][0]),b=get(queries[j][0]);
		if(a!=b) return a<b;
		return queries[i][1]<queries[j][1];
	});
	vector<int> ans(m);
	//初始化当前区间[1,0]
	for(int k=0,l=1,r=0;k<m;k++){
		int ql = queries[idx[k]][0],qr = queries[idx[k]][1];
		while(ql<l) add(a[--l]);//查询区间l比当前区间l小，向左移动l
		while(qr>r) add(a[++r]);//查询区间r比当前区间r大，向右移动r
		while(ql>l) del(a[l++]);//查询区间l比当前区间l大，向右移动l
		while(qr<r) del(a[r--]);//查询区间r比当前区间r小，向左移动r
		ans[idx[k]]=mp[queries[idx[k]][2]];
	}
	for(int x:ans)cout<<x<<"\n";
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int t=1;
	//cin>>t;
	while(t--){
		solve();
		if(t)cout<<"\n";
	}
	return 0;
}